﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using DAO;
using Entidad;
namespace DAO
{
  public  class UsuarioDAO : ABMCUsuarioInterface
    {

        private DAO_v2 dao;
     
        public UsuarioDAO()
        {
            dao = new DAO_v2();
            
        }
        public string CadenaConexion()
        {
            return dao.StringConexion();
        }

      public void registrarUsuario(UsuarioEnt usuario, int id_persona)
        {
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
               
                cn.Open();        
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
                parametros.Add("legajo");
                datos.Add(usuario.Legajo);
                parametros.Add("id_Persona");
                datos.Add(id_persona);
                parametros.Add("eMail");
                datos.Add(usuario.Email);
                parametros.Add("contraseña");
                datos.Add(usuario.Contraseña);
                parametros.Add("activo");
                datos.Add(usuario.Activo);
                parametros.Add("fechaCreacion");
                datos.Add(usuario.FechaCreacion);
                parametros.Add("id_Rol");
                datos.Add(usuario.id_rol);

                SqlCommand cmd = dao.Grabar("Usuario",parametros,datos);
                cmd.Connection =cn;
                cmd.ExecuteNonQuery();


            }
            catch (SqlException ex)
            {
                throw new ApplicationException("Problema al grabar los datos");
            }
            finally
            {
                dao.CerrarConexion(cn);
            }
        

        }

      public void actualizarUsuario(UsuarioEnt usuario, int id_persona)
      {
          SqlConnection cn = new SqlConnection(CadenaConexion());
          try
          {
              cn.Open();
                List<String> parametrosSet = new List<String>();
                List<Object> datosSet = new List<Object>();
                List<String> parametrosWhere = new List<String>();
                List<Object> datosWhere = new List<Object>();
                parametrosSet.Add("id_persona");
                datosSet.Add(id_persona);
                parametrosSet.Add("eMail");
                datosSet.Add(usuario.Email);
                parametrosSet.Add("contraseña");
                datosSet.Add(usuario.Contraseña);
                parametrosSet.Add("activo");
                datosSet.Add(usuario.Activo);
                parametrosSet.Add("id_Rol");
                datosSet.Add(usuario.id_rol);


                parametrosWhere.Add("id_Usuario");
                datosWhere.Add(usuario.id_Usuario);      
                SqlCommand cmd = dao.Actualizar("Usuario", parametrosSet, datosSet, parametrosWhere, datosWhere);
                cmd.Connection = cn;
                cmd.ExecuteNonQuery();
                
          }
          catch (SqlException ex)
          {
              throw new ApplicationException("Error al actualizar el Usuario...");
          }
          finally
          {
              dao.CerrarConexion(cn);
          }

      }
   
      public void borrarUsuario(int id_usuario) //En vez de elimina le cambiamos el estado "Activo" para mantenerlo en la BD 
      {
          SqlConnection cn = new SqlConnection(CadenaConexion()); 
          try
          {
              cn.Open();
              List<String> parametrosSet = new List<String>();
              List<Object> datosSet = new List<Object>();
              List<String> parametrosWhere = new List<String>();
              List<Object> datosWhere = new List<Object>();
              parametrosSet.Add("activo");
              datosSet.Add(0);
              parametrosWhere.Add("id_Usuario");
              datosWhere.Add(id_usuario);
              SqlCommand cmd = dao.Actualizar("Usuario", parametrosSet, datosSet, parametrosWhere, datosWhere);
          
              cmd.Connection = cn;
              cmd.ExecuteNonQuery();
          }
          catch (SqlException ex)
          {
              throw new ApplicationException("Error al eliminar el Usuario...");
          }
          finally
          {
              dao.CerrarConexion(cn);
          }

      }


      public UsuarioEnt buscarUsuario(int id_usuario)
        {
            UsuarioEnt resultado = new UsuarioEnt();

          
            SqlConnection cn = new SqlConnection(CadenaConexion());
            try
            {
           
                cn.Open();
                List<String> columnas = new List<String>();
                List<String> parametros = new List<String>();
                List<Object> datos = new List<Object>();
               
                columnas.Add("legajo");
                columnas.Add("id_Persona");
                columnas.Add("eMail");
                columnas.Add("contraseña");
                columnas.Add("activo");
                columnas.Add("fechaCreacion");
                columnas.Add("id_Rol");
                parametros.Add("id_Usuario");
                datos.Add(id_usuario);
                SqlCommand cmd = dao.Buscar("Usuario", columnas, parametros, datos);
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    resultado.id_Usuario = id_usuario;
                    resultado.Legajo= int.Parse(dr["legajo"].ToString());
                    resultado.PersonaID = int.Parse(dr["id_Persona"].ToString());
                    resultado.Email = dr["eMail"].ToString();
                    resultado.Contraseña = dr["contraseña"].ToString();
                    resultado.Activo= Boolean.Parse(dr["activo"].ToString());
                    resultado.FechaCreacion = DateTime.Parse(dr["fechaCreacion"].ToString());
                    resultado.id_rol = int.Parse(dr["id_Rol"].ToString());
                 
                
                }
                return resultado;
            }
            catch (SqlException ex)
            {
                return null;
                throw new ApplicationException("Error al buscar el usuario...");
            }
            finally
            {
                if (cn.State == System.Data.ConnectionState.Open)
                {
                    cn.Close();
                }
            }
          
          }

      public  List<UsuarioEnt> buscarUsuarioFiltro(String filtro)
      {


          SqlConnection cn = new SqlConnection(CadenaConexion());
          try
          {     List<UsuarioEnt> resultado = new List<UsuarioEnt>();

              cn.Open();
               List<String> tablas = new List<String>();
              List<String> columnas = new List<String>();
              List<String> pk = new List<String>();
              List<String> fk = new List<String>();
              tablas.Add("Persona p");
              tablas.Add("Usuario u");
              columnas.Add("u.id_Usuario");
              columnas.Add("u.legajo");
              columnas.Add("u.id_Persona");
              columnas.Add("u.eMail");
              columnas.Add("u.contraseña");
              columnas.Add("u.activo");
              columnas.Add("u.fechaCreacion");
              columnas.Add("u.id_Rol");
              columnas.Add("p.nombre AS Nombre");
              columnas.Add("p.apellido ");
              fk.Add("u.id_Persona");
              pk.Add("p.id_Persona"+ filtro);
            
              
              SqlCommand cmd = dao.BuscarVariasTablasSinFiltro(tablas, columnas, fk, pk);
              //SqlCommand cmd = dao.Buscar("Usuario", columnas, parametros, datos);
              cmd.Connection = cn;
              SqlDataReader dr = cmd.ExecuteReader();
              while(dr.Read())
              {
                  UsuarioEnt usuario = new UsuarioEnt();
                  usuario.Nombre = dr["Nombre"].ToString();
                  usuario.Apellido = dr["apellido"].ToString();
                  usuario.id_Usuario = int.Parse(dr["id_Usuario"].ToString());
                  usuario.Legajo = int.Parse(dr["legajo"].ToString());
                  usuario.PersonaID = int.Parse(dr["id_Persona"].ToString());
                  usuario.Email = dr["eMail"].ToString();
                  usuario.Contraseña = dr["contraseña"].ToString();
                  usuario.Activo = Boolean.Parse(dr["activo"].ToString());
                  usuario.FechaCreacion = DateTime.Parse(dr["fechaCreacion"].ToString());
                  usuario.id_rol = int.Parse(dr["id_Rol"].ToString());
                  resultado.Add(usuario);

              }
              return resultado;
          }
          catch (SqlException ex)
          {
              return null;
              throw new ApplicationException("Error al buscar el usuario...");
          }
          finally
          {
              if (cn.State == System.Data.ConnectionState.Open)
              {
                  cn.Close();
              }
          }

      }




      //usuario
      public List<UsuarioEnt> ObtenerUsuariosQueryParaAdmin()
      {
          throw new NotImplementedException();
      }
      public List<UsuarioEnt> ObtenerUsuariosQueryParaOtros()
      {
          throw new NotImplementedException();
      }

      //Persona

      public int registrarPersona(PersonaEnt persona)
      {
          throw new NotImplementedException();
      }
      public void actualizarPersona(PersonaEnt persona)
      {
         PersonaDAO res = new PersonaDAO();
         res.actualizarPersona(persona);
          //throw new NotImplementedException();
      }
      public List<Entidad.TipoDNIEnt> obtenerTipoDoc()
      {

          throw new NotImplementedException();
      }
      public void borrarPersona(int id_persona)
      {
          throw new NotImplementedException();
      }
      public PersonaEnt BuscarPersona(int id_persona)
      {
          PersonaDAO res = new PersonaDAO();
          return res.BuscarPersona(id_persona);//Redirecciono el metodo

      
      }
      public Boolean BuscarPersonaDocumento(int documento, int tipoDoc)
      {
          throw new NotImplementedException();
      }
    
    }

      
}
